/*
* @Author: liqs
* @Date:   2020/11/29 11:17
 */
package file

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"os"
)

// 打开文件，返回指针类型
func OpenFile(filepath string) (file *os.File) {
	file, error := os.Open(filepath)
	if error != nil {
		fmt.Println("open file failed, error is ", error)
	}
	return file
}

// 带缓冲区的方式读取文件  适用于大文件读取
func ReadFileByReader(file *os.File) {
	// 默认缓冲为 4096
	reader := bufio.NewReader(file)
	// 循环读取 reader
	for {
		// 换行符号  每次读取一行
		s, error := reader.ReadString('\n')
		fmt.Print(s)
		// 判断是否读取到文件的末尾 未到则继续读取
		if error == io.EOF {
			break
		}
	}
}

// 一次性读取文件  适用于小文件的读取
func ReadFileByIoUtils(filePath string) {
	// 没有显示的打开文件，所以不用关闭文件  文件的打开关闭封装到 ReadFile 里面了 （源代码）
	bytes, error := ioutil.ReadFile(filePath)
	if error != nil {
		fmt.Println("read file failed, error = ", error)
	}
	fmt.Println(string(bytes))
}

// 创建文件 或 打开文件
// 往文件写入内容
// 往文件追加内容
func CreatFileWriteContents(filePath string) {

	// os.O_CREATE 表示当文件不存在时主动创建文件
	// os.O_CREATE 表示当文件不存在时主动创建文件
	// os.O_WRONLY 表示写入权限
	//  os.O_APPEND 表示追加内容
	// os.O_TRUNC   先清空文件，然后在写入
	// 上述可以进行组合
	file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
		fmt.Printf("open file err=%v\n", err)
		return
	}
	//及时关闭file句柄
	defer file.Close()
	//准备写入5句 "hello, Gardon"

	//  \r 在 记事本中换行
	//   \n 在其他换行
	str := "hello,Gardon\r\n" // \r\n 表示换行
	//写入时，使用带缓存的 *Writer
	writer := bufio.NewWriter(file)
	for i := 0; i < 5; i++ {
		writer.WriteString(str)
	}
	//因为writer是带缓存，因此在调用WriterString方法时，其实
	//内容是先写入到缓存的,所以需要调用Flush方法，将缓冲的数据
	//真正写入到文件中， 否则文件中会没有数据!!!
	writer.Flush()
}

// 判断文件是否存在
func FileIsexist(filePath string) bool {
	stat, _ := os.Stat(filePath)
	return stat.IsDir()
}
